package com.iflytek.sbd.demo.daili.dongtaidaili.jdk;

import java.lang.reflect.Proxy;

/**
 * @program: sbd
 * @description:
 * @author: 陈英俊
 * @create: 2022-01-04 14:42
 */
public class Demo {

    /**
     * 动态代理解决至方法与方法之间的耦合
     * IOC解决的类与类之间的耦合
     * <p>
     * JDK的动态代理主要是通过反射类Proxy和InvocationHandler回调接口实现的,所有进行代理的类必须要实现接口,
     * 这样有了一定的局限性而且反射的效率也不高
     *
     * @param args
     */
    public static void main(String[] args) {
        // 保存代理类
        System.getProperties().setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

        // 创建被代理对象,实际干活的对象
        GoodByeInterface trueGoodBye = new GoodBye();
        // 自定义实现了InvocationHandler接口的调用处理器ProxyHandler类,搞个构造函数,被代理对象最为唯一参数
        ProxyHandler handler = new ProxyHandler(trueGoodBye);
        // 通过为Proxy类指定ClassLoader对象和一组Interface来创建动态代理类
        ClassLoader classLoader = trueGoodBye.getClass().getClassLoader();
        Class<?>[] interfaces = trueGoodBye.getClass().getInterfaces();
        GoodByeInterface proxyInstance = (GoodByeInterface) Proxy.newProxyInstance(classLoader, interfaces, handler);
        System.out.println(proxyInstance.sayGoodBye("gg"));


        //=============================================================================
        Gg gg = new Gg();
        ProxyHandler proxyHandler1 = new ProxyHandler(gg);
        GgInterface ggInterface = (GgInterface) Proxy.newProxyInstance
                (gg.getClass().getClassLoader(),
                        gg.getClass().getInterfaces(),
                        proxyHandler1);
        ggInterface.sayGG();

    }
}
